#pragma once
#include "EventLoop.h"
#include "Socket.h"
#include "Channel.h"
#include "Acceptor.h"
#include <map>
class TcpServer {
private:
    EventLoop loop_;  // 单线程下暂时只用一个事件循环
    Acceptor *acceptor_; // 一个TcpServer只有一个Acceptor对象
    std::map<int,Connection*> conns_;

    std::function<void(Connection*)> newconnectioncb_;     // 回调 EchoServer::HandleNewConnection()
    std::function<void(Connection*)> closeconnectioncb_;   // 回调 EchoServer::HandleClose()
    std::function<void(Connection*)> errorconnectioncb_;   // 回调 EchoServer::HandleError()
    std::function<void(Connection*, std::string&)> onmessagecb_;  // 回调 EchoServer::HandleMessage()
    std::function<void(Connection*)> sendcompletecb_;       // 回调 EchoServer::HandleSendComplete()
    std::function<void(EventLoop*)> timeoutcb_;             // 回调 EchoServer::HandleTimeout()

public:
    TcpServer(const std::string &ip, const uint16_t port);
    ~TcpServer();

    void start();

    void newconnection(Socket* clientsock);
    void closeconnection(Connection *conn);
    void errorconnection(Connection *conn);
    void haddlemessage(Connection* conn,std::string &message);
    void sendcomplete(Connection *conn);
    void epolltimeout(EventLoop *loop);


        // 设置新连接建立时的回调（参数：Connection指针）
    void setNewConnectionCB(std::function<void(Connection*)> fn);

    // 设置连接关闭时的回调（参数：Connection指针）  
    void setCloseConnectionCB(std::function<void(Connection*)> fn);

    // 设置连接错误时的回调（参数：Connection指针）
    void setErrorConnectionCB(std::function<void(Connection*)> fn);

    // 设置消息到达时的回调（参数：Connection指针 + 消息内容引用）
    void setOnMessageCB(std::function<void(Connection*, std::string& message)> fn);

    // 设置数据发送完成时的回调（参数：Connection指针）
    void setSendCompleteCB(std::function<void(Connection*)> fn);

    // 设置超时事件回调（参数：EventLoop指针）  
    void setTimeoutCB(std::function<void(EventLoop*)> fn);

};